/******************************************************************************
                         COPYRIGHT 1955-2008 by BUPT ISC.
                        北京邮电大学信息安全中心 版权所有
                           Web: http://www.bupt.edu.cn
 *******************************************************************************/
/*******************************************************************************
  文件名： conf_helper.h
  项目：   
  模块：   common
  作者：   huangwei
  版本：   0.1
  创建于:  2009-03-20
  描述：
    配置文件解析模块

  修改历史：
  日期： 修改人： 修改描述：
  
 *********************************************************************************/

#ifndef _CONF_HELPER_
#define _CONF_HELPER_

#include <stdio.h>
#include <sys/time.h>

#include "hash.h"

#define ITEM_SP  "\n"                  /* 定义单个配置项分割字符串 */

#define MAX_COLS 1024                  /* 定义单行最大长度 */
#define MAX_NAME 128                   /* 定义最大配置项名称长度 */
#define MAX_VALUE MAX_COLS - MAX_NAME  /* 定义最大配置值长度*/
#ifndef FILENAME_MAX                   /* 最大文件名长度 */
#define FILENAME_MAX 4096              /* stdio.h中定义的是4096 */
#endif
#define CONFIG_UPDATE_MANUAL  0        /* 手工更新配置参数缓存 */
#define CONFIG_UPDATE_BY_TIME 1        /* 定时自动更新配置参数缓存 */
#define CONFIG_UPDATE_AUTO    2        /* 配置文件变化时自动更新配置参数缓存 */

#define HASH_FACTOR    0.6             /* Hash负载因子 */

/* 调用状态返回码 */
#define OK               0             /* 函数调用成功 */
#define CONFIG_NOT_EXIST -1            /* 配置文件不存在 */
#define CONFIG_OPEN_FAILED -2          /* 配置文件读取失败 */

typedef struct _CONFIG_NODE_T 
{
    char acName[MAX_NAME];             /* 配置项的查找名称 */
    char acValue[MAX_VALUE];           /* 配置项的值 */
} CONFIG_NODE_T;                       /* 配置节点数据结构 */

typedef struct _CONFIG_CACHE_T 
{
    struct timeval pstLastUpdateTime; /* 最后更新时间 */
    char acUpdateDigest[32];           /* 配置文件Hash摘要 */
    int iUpdateType;                   /* 更新方法 */
    char acFile[FILENAME_MAX];         /* 配置文件名 */
    HASH_TABLE_T *pstHashTable;        /* Hash表数据缓存 */
} CONFIG_CACHE_T;                      /* 配置参数Hash表缓存 */

/* 初始化配置文件并将配置文件读入配置缓存 */
int initConfigCache(const char *pcFileName, CONFIG_CACHE_T *pstConfigCache);

/* 更新配置参数缓存 */
int updateConfigCache(CONFIG_CACHE_T *pstConfigCache);

/* 在配置缓存中的Hash表中按照配置项名称查找配置项的值 */
char **findInConfigCacheByKey(CONFIG_CACHE_T *pstConfigCache, const char *pcKey);

/* 释放findInConfigCacheByKey函数返回值所占用的堆内存 */
void freeConfigCacheValues(char ** );

/* 释放配置缓存所占用的内存资源 */
int destroyConfigCache(CONFIG_CACHE_T *pstConfigCache);

/* 调试打印CONFIG_CACHE_T结构体内容 */
void debugConfigCache(CONFIG_CACHE_T *pstConfigCache);
#endif
